#ifndef EXPRESION_H_INCLUDED
#define EXPRESION_H_INCLUDED
  #include "AB.h"

  typedef TAB TExpresion ;


/*PRE: Recive un puntero a un arbol de expresion no creado.
  POS: Crea el arbol*/
  int Expresion_Crear (TExpresion* expr);

/*PRE: Recibe un puntero a un arbol de expresion creado, y dos strings.
       string: se espera la formula matematica
       var: indica cual es la variable independiente.
  POS: Genera el arbol de expresion correspondiende a la expresion de string. Si se produce algun error devuelve -1 sino devuelve 1*/
  int Expresion_Parsear (TExpresion* expr, const char* string, const char* var);

/*PRE: Recibe un puntero a un arbol de expresion creado y no vacio, y otro puntero a un arbol no creado.
  POS: Crea el arbol de salida y devuelve el arbol de expresion derivado. Devuelve 1 si logro derivar o 0 si ocurre algun error*/
  int Expresion_Derivar (const TExpresion* expr, TExpresion* deriv);

/*PRE: Recibe un puntero a un arbol de expresion creado y no vacio, y otro puntero a un arbol no creado.
  POS: Crea el arbol de salida y devuelve el arbol de expresion simplificado. Retorna 1 si pudo simplificar la expresion o retorna el error devuelto por las primitivas de simplificacion*/
  int Expresion_Simplificar (const TExpresion* expr, TExpresion* simpl);

/*PRE: Recibe el puntero a un arbol de expresion creado y no vacio, y un puntero a un string sin memoria allocada.
  POS: Recorre el arbolde expreion y devuelve la funcion que representa en el string. En caso de producirse algun error devuelve -1 sino devuelve 1*/
  int Expresion_AString (const TExpresion* expr, char** string);

/*PRE: Recibe el puntero de un arbol de expresion creado y no vacio.
  POS: Libera la memoria del arbol de expresion. devuelve 1 si pudo liberar correctamente la memoria, o 0 si tubo algun error*/
  int Expresion_Destruir (TExpresion* expr);

/*  FUNCION AUXILIAR
  PRE: Recivbe los punteros de arbol de expresion origen creado y no vacio y otro destino no creado, y un tipo de movimiento
       movim aceptta como movimientos: RAIZ, DER e IZQ.
  POS: Crea el arbol destino y copia las subrramas del origen a partir del movimiento indicado respecto del corriente del origen*/
  void Expresion_Copiar_SubExpresion (const TExpresion* origen, TExpresion* destino, int movim);

#endif // EXPRESION_H_INCLUDED
